package com.ling.luo.util;

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.net.URL;
import java.util.*;

/**
 * 版权所有(C) 2018 深圳雁联计算系统有限公司
 *
 * @desc
 * @author: 黄伟
 * @create: 2019/4/1
 **/

public abstract class BaseMysqlGenerator {

	/**
	 * 表命
	 */
	private String tableName;

	/**
	 * 作者
	 */
	private String author;

	private String outputDir = "src/main/java";


	/**
	 * <p>
	 * 读取控制台内容
	 * </p>
	 */
	protected void scanner() {
		Scanner scanner = new Scanner(System.in);
		String help = "代码生成开始,请输入表名:";
		System.out.println(help);
		// 现在有输入数据
		if (scanner.hasNext()) {
			tableName = scanner.next();
		}
		String help1 = "代码生成,生成的作者:";
		System.out.println(help1);
		if (scanner.hasNext()) {
			author = scanner.next();
		}
	}

	private String getPath() {
		URL u = getClass().getResource("/");
		return u.getPath().replace("/target/classes", "");
	}


	/**
	 * 获取数据库配置
	 * @return DataSourceConfig
	 */
	protected abstract DataSourceConfig getDataSourceConfig();

	/**
	 * parent
	 *  @return String
	 */
	protected abstract String getParent();

	/**
	 * model
	 * @return String
	 */
	protected abstract String getModel();

	/**
	 * packageurl
	 *  @return String
	 */
	protected abstract String getPackageUrl();

	/**
	 * <p>
	 * MySQL 生成演示
	 * </p>
	 */
	public void generator() {
		scanner();
		// 代码生成器
		AutoGenerator mpg = new AutoGenerator().setGlobalConfig(
				// 全局配置
				new GlobalConfig().setOutputDir(getPath() + outputDir)
						// 是否覆盖文件
						.setFileOverride(true)
						// 开启 activeRecord 模式
						.setActiveRecord(true)
						// XML 二级缓存
						.setEnableCache(false)
						// XML ResultMap
						.setBaseResultMap(true)
						// XML columList
						.setBaseColumnList(true)
						.setAuthor(author)
						.setServiceName("%sService")
						.setServiceImplName("%sServiceImpl")
						.setControllerName("%sController")
						.setSwagger2(true)
		).setDataSource(
				// 数据源配置
				getDataSourceConfig()
		).setStrategy(
				// 策略配置
				new StrategyConfig().setTablePrefix("t_alipay_").setNaming(NamingStrategy.underline_to_camel)
						// 需要生成的表,注释掉就默认生产链接库的所有表
						.setInclude(tableName).setEntityLombokModel(true).setRestControllerStyle(true)
						//.setSuperControllerClass("com.ylink.ecs.eoms.controller.BaseController")
		).setPackageInfo(
				// 包配置
				new PackageConfig()
						// 自定义包路径
						.setParent(getParent())
						.setModuleName(getModel())

		).setCfg(
				// 注入自定义配置，可以在 VM 中使用 cfg.abc 设置的值
				new InjectionConfig() {
					@Override
					public void initMap() {
						List<TableInfo> list = this.getConfig().getTableInfoList();
						Map<String, Object> map = new HashMap<>(10);
						map.put("appService", getParent() + "." + getModel() + ".app");
						for (TableInfo tableInfo : list) {
							map.put("appServiceName", tableInfo.getEntityName() + "AppService");
						}
						this.setMap(map);
					}
				}.setFileOutConfigList(file())
		).setTemplate(
				// 关闭默认 xml 生成，调整生成 至 根目录
				new TemplateConfig().setXml(null)
		);
		// 执行生成
		mpg.setTemplateEngine(new FreemarkerTemplateEngine());
		mpg.execute();
	}


	/**
	 * 加载自定义文件
	 */
	private List<FileOutConfig> file() {
		List<FileOutConfig> list = new ArrayList<>();
		list.add(new FileOutConfig(
				"/templates/mapper.xml.ftl") {
			// 自定义输出文件目录
			@Override
			public String outputFile(TableInfo tableInfo) {
				return getPath() + "src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper.xml";
			}
		});
		list.add(new FileOutConfig(
				"/templates/mapper.java.ftl") {
			// 自定义输出文件目录
			@Override
			public String outputFile(TableInfo tableInfo) {
				return getPath() + "src/main/java" + getPackageUrl() + "mapper/" + String.format("%sMapper", tableInfo.getEntityName()) + ".java";
			}
		});
		list.add(new FileOutConfig(
				"/templates/service.java.ftl") {
			// 自定义输出文件目录
			@Override
			public String outputFile(TableInfo tableInfo) {
				return getPath() + "src/main/java" + getPackageUrl() + "service/" + String.format("%sService", tableInfo.getEntityName()) + ".java";
			}
		});
		list.add(new FileOutConfig(
				"/templates/serviceImpl.java.ftl") {
			// 自定义输出文件目录
			@Override
			public String outputFile(TableInfo tableInfo) {
				return getPath() + "src/main/java" + getPackageUrl() + "service/impl/" + String.format("%sServiceImpl", tableInfo.getEntityName()) + ".java";
			}
		});
		list.add(new FileOutConfig(
				"/templates/appService.java.ftl") {
			// 自定义输出文件目录
			@Override
			public String outputFile(TableInfo tableInfo) {
				return getPath() + "src/main/java" + getPackageUrl() + "app/" + String.format("%sAppService", tableInfo.getEntityName()) + ".java";
			}
		});
		list.add(new FileOutConfig(
				"/templates/appServiceImpl.java.ftl") {
			// 自定义输出文件目录
			@Override
			public String outputFile(TableInfo tableInfo) {
				return getPath() + "src/main/java" + getPackageUrl() + "app/" + String.format("%sAppServiceImpl", tableInfo.getEntityName()) + ".java";
			}
		});

		return list;

	}

}